/**
 * 该文件为小程序统一登录 及 封装接口请求至wx中，对登录和请求进行中转处理
 * app.js 只需要引入此文件即可！！！ 不可重复引用！！！
 * 接口请求 wx.$requestApi(u,d,c,l) 同之前一样的使用方法
 * wx.$isLogin 可获取登录状态
 */
(function () {
    var net = require("net.js");
    var lockNum = 0;
    wx.$bPromise = false; //是否请求Promise
    wx.$isLogin = false; //是否登录状态
    wx.$aLoginWait = []; //登录等待列表

    //检测本地是否存在sAuthCode  看看有没有必要哇~  不重要~~~再说
    if (wx.getStorageSync(net._cfg.net.storagename) && wx.getStorageSync(net._cfg.net.storagename) != "") {
        wx.$isLogin = true; //存在则设置登录状态为true
    }
    /*
     * 接口请求中转处理
     * u "news/xinqujianshe/getList"是这个你懂了噻
     * d {} 传递参数
     * c 回调方法
     * l 自定义请求地址(不建议需要登录的接口使用，会导致两边接口你登过来我登过去的，没必要！！！)
     */
    wx.$requestApi = (u, d, c, l) => {
        //不存在登录
        if (!wx.$isLogin) {
            console.log("未检测到登录,接口：" + u + " 存入接口列表")
            wx.$aLoginWait.push([u, d, c, l]);
            if (!wx.$bPromise) {
                FNLogin();
                wx.$bPromise = !wx.$bPromise;
            }
            return;
        }
        //执行接口请求
        net.requestApi(u, d, function (r) {
            //只要执行了请求 就必须清除掉等待接口信息
            FNClearLoginWait(u);
            //时间长了登录信息有可能失效哒 我又不晓得后台什么时候失效 咋办嘞... 让前台登录也失效噻~
            if (r.code == 10040 && lockNum <= 2) { //加锁 只给2次机会 如果一直执行这段请检查你的代码！！！
                wx.$isLogin = false; //修改登录失效
                wx.$requestApi(u, d, c, l); //这种情况不可能出现群体事件，所以把自己请求再执行一次就欧克了
                lockNum++;
                return;
            }
            if (lockNum >= 2) {
                console.error("肆郎温馨提示：一直获取不到用户信息，你就没想下是你自己的问题？？？")
            }
            lockNum = 0; //清锁
            //前端接口回调
            c(r);
        }, l);
    }
    //修改请求连接 只能是配置档中对应值哦
    wx.$changeRequest = (l) => {
        net.changeRequest(l);
    }
    //公共登录
    var FNLogin = () => {
        let p = new Promise(function (resolve, reject) {
            console.log("###开始执行Promise进行登录###");
            wx.login({
                success: res => {
                    // 发送 res.code 到后台换取 openId, sessionKey, unionId
                    var sCode = res.code;
                    net.requestApi(net._cfg.net.loginapi, {
                        sCode: sCode
                    }, function (res) {
                        if (res.code == 0) {
                            //本地存储
                            wx.setStorageSync(net._cfg.net.storagename, res.data.sAuthCode);
                            resolve(wx.$aLoginWait);
                            //设置状态
                            wx.$isLogin = true;
                            wx.$bPromise = !wx.$bPromise;
                        }
                    })
                }
            })
        }).then(res => { //登录完成后执行等待列表内的请求
            console.log("###登录成功开始执行等待列表###");
            res.forEach(el => {
                wx.$requestApi(el[0], el[1], el[2], el[3]);
            });

        })
        return p;
    }
    //清除等待接口信息
    var FNClearLoginWait = (u) => {
        for (var i = 0; i < wx.$aLoginWait.length; i++) {
            if (wx.$aLoginWait[i][0] == u) {
                wx.$aLoginWait.splice(i, 1);
            }
        }
    }
})()